# Table of Contents
# JSP
JSP(Java Server Pages)는 HTML에 Java 코드를 삽입하여 동적으로 웹 페이지를 생성하는 언어다. 아래는 JSP의 예제다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String name = "Paul";
		String nation = "England";
	%>
	<h1><%= name %></h1>
	<h1><%= nation %></h1>
</body>
</html>
# JSP의 동작 원리
JSP는 다음과 같은 과정으로 처리된다.
Web container는 JSP 파일을 Servlet으로 변환한다.
MyPage.jsp>MyPage_jsp.java
Servlet 내부에서 JSP 파일의 내용을 출력한다. 생성된
MyPage_jsp.java의 코드의 일부분을 살펴보자.
public final class MyPage_jsp {
    public void _jspService(final HttpServletRequest request, HttpServletResponse response)
        // ...
        out.write("\n");
        out.write("<!DOCTYPE html>\n");
        out.write("<html>\n");
        out.write("<head>\n");
        out.write("<meta charset=\"UTF-8\">\n");
        out.write("<title>Insert title here</title>\n");
        out.write("</head>\n");
        out.write("<body>\n");
        out.write("	");
        String name = "Paul";
        String nation = "England";
	
        out.write("\n");
        out.write("	<h1>");
        out.print( name );
        out.write("</h1>\n");
        out.write("	<h1>");
        out.print( nation );
        out.write("</h1>\n");
        out.write("</body>\n");
        out.write("</html>");    
    }
}
- Web Container는 Servlet을 처리한다.
 
요약하자면 JSP는 MyPage.js > MyPage_jsp.java > MyPage_jsp.class > HTML 순서대로 처리된다.
# JSP tag
JSP tag는 JSP 문서 안에 Java 코드를 삽입할 때 사용한다.
# 자바 코드
<% %>를 사용하여 자바 코드를 추가할 수 있다.
<%
    for (int i=0; i<10; i++) {
        out.println(i + "<br />");
    }
%>
# 주석
주석은 <%-- --> 형태로 사용한다.
<%--
    for (int i=0; i<10; i++) {
        out.println(i + "<br />");
    }
--%>
# 메소드, 변수 선언
<%! %>는 변수를 선언하거나 함수를 정의할 때 사용한다.
<%!
    int i = 0;
    String name = “ronaldo”;
%>
<%!
    public int sum(a, b){
        return a+b;
    }
%>
<%
    out.println(i+”< br/>”);
    out.println(sum(4, 6)+”< br/>”);
%>
# 표현식
JSP에서 무언가를 출력하려면 out.println()을 사용한다. <%! %>는 변수를 선언하거나 함수를 정의할 때 사용한다.
<%!
    int i = 0;
%>
<%!
    public int sum(a, b){
        return a+b;
    }
%>
<%
    out.println(i);
    out.println(sum(4, 6));
%>
<%= %>를 사용하면 더 쉽게 출력할 수 있다.
<%!
    int i = 0;
    String name = “ronaldo”;
%>
<%!
    public int sum(a, b){
        return a+b;
    }
%>
<%= i%>
<%= sum(4, 6)%>
# 지시자
지시자는 JSP 페이지의 속성을 지정할 때 사용한다. <%@ %> 형태로 사용한다.
# page
page 속성은 해당 페이지의 속성을 지정할 때 사용한다.
<%@ page language=“java” contentType=“/text/html”; charset=“EUC-KR” pageEncoding=“EUC-KR” %>
<%@ page import=“java.util.Arrays” %>
<%
    int arr[] = {10, 20, 30}
    out.println(Arrays.toString(arr));
%>
# include
페이지에 다른 페이지를 삽입할 때 사용한다.
// Sub.jsp
<h1>This is Sub.jsp</h1>
// Main.jsp
<h1>This is Main.jsp</h1>
<%@ include file=“Sub.jsp” %>
<h1>This is Main.jsp</h1>
# taglib
태그 라이브러리를 사용할 때 사용한다.
# JSP Action Tag
JSP Action Tag는 JSP 페이지 내에서 특정 동작을 하도록 지시하는 태그다.
# include 태그
현재 페이지에 다른 페이지를 삽입한다.
// Main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>This is Main.jsp</h1>
    <jsp:include page="Sub.jsp" />
</body>
</html>
// Sub.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>This is Sub.jsp</h1>
</body>
</html>

# forward 태그
현재 페이지에서 다른 페이지로 전환한다.
// Main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>This is Main.jsp</h1>
<jsp:forward page="Sub.jsp" />
</body>
</html>

# param 태그
forward 태그나 include 태그를 사용할 때 데이터를 전달하기 위해 사용한다.
// Main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>This is Main.jsp</h1>
<jsp:forward page="Sub.jsp">
	<jsp:param name="name" value="Paul" />
	<jsp:param name="nation" value="England"/>
</jsp:forward>
</body>
</html>
// Sub.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>This is Sub.jsp</h1>
	<%= request.getParameter("name") %>
	<%= request.getParameter("nation") %>
</body>
</html>

# Bean 객체
JSP 페이지에서 사용할 Java 객체를 Bean이라고 한다. 다음 Person객체를 JSP 페이지에 만들어보자.
package com.yologger.project;
public class Person {
	private String name;
	private String nation;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNation() {
		return nation;
	}
	public void setNation(String nation) {
		this.nation = nation;
	}	
}
<jsp:useBean> 태그를 사용하면 JSP 페이지에서 사용할 객체를 생성할 수 있다.
// Main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <jsp:useBean id="person" class="com.yologger.project.Person"></jsp:useBean>
</body>
</html>
Bean은 생성되었으나 name, nation 속성이 초기화되지 않았다. 다음과 같이 초기화한다.
// Main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <jsp:useBean id="person" class="com.yologger.project.Person"></jsp:useBean>
    <jsp:setProperty name="person" property="name" value="Paul"/>
    <jsp:setProperty name="person" property="nation" value="Portugal"/>
</body>
</html>
Bean은 다음과 같이 접근할 수 있다.
// Main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <jsp:useBean id="person" class="com.yologger.project.Person"></jsp:useBean>
    <jsp:setProperty name="person" property="name" value="Paul"/>
    <jsp:setProperty name="person" property="nation" value="Portugal"/>
    <jsp:getProperty name="person" property="name" />
    <jsp:getProperty name="person" property="nation" />
</body>
</html>
다음과 같이 JSP Tag를 통해 접근할 수도 있다.
// Main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <jsp:useBean id="person" class="com.yologger.project.Person"></jsp:useBean>
    <jsp:setProperty name="person" property="name" value="Paul"/>
    <jsp:setProperty name="person" property="nation" value="Portugal"/>
    <%= person.getName() %>
    <%= person.getNation() %>
</body>
</html>
Bean을 생성할 때 Scope를 지정할 수 있다.
<jsp:useBean id="person" class="com.yologger.project.Person" scope="page"></jsp:useBean>
| 값 | 설명 | 
|---|---|
| scope | Bean을 생성한 현재 JSP 페이지에서만 접근 가능 | 
| request | <jsp:forward>를 통해 이동한 페이지에서도 접근 가능 | 
| session | 세션이 종료되기 전까지 모든 페이지에서는 모두 접근 가능 | 
| application | 어플리케이션이 종료되기 전까지 모든 페이지에서 접근 가능 | 
# EL(Expression Language)
JSP Tag의 표현식을 사용하여 값을 표현할 수 있다.
<%= person.name %>
JSP Action Tag를 사용하여 값을 표현할 수도 있다.
<jsp:getProperty name="person" property="nation" />
EL(Expression Language)을 사용하면 더욱 쉽게 값을 표현할 수 있다.
${person.name}
EL을 사용한 몇 가지 예제를 살펴보자.
// Main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div>${10}</div>
	<div>${10+10}</div>
	<div>${"Paul"}</div>
	<div>${true}</div>
</body>
</html>
결과는 다음과 같다.

# JSP 예외 페이지
예외(Exception)이 발생하면 특정 페이지를 보여줄 수 있다. 다음과 같이 <%@ page isErrorPage="true" %> JSP Action Tag를 추가하여 예외 페이지를 지정할 수 있다.
// errorPage404.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>404 Error page</title>
</head>
<body>
<h1>This is 404 Error page</h1>
</body>
</html>
이제 예외 페이지를 등록해야한다. 등록 방법에는 두 가지가 있다.
# web.xml에 예외 페이지 등록
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  
    <welcome-file-list>
        <!-- ... -->
    </welcome-file-list>
  
    <error-page>
        <error-code>404</error-code>
        <location>/errorPage404.jsp</location>
    </error-page>
</web-app>
다음과 같이 여러 에러 코드에 대한 예외 페이지를 등록할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  
    <welcome-file-list>
        <!-- ... -->
    </welcome-file-list>
  
    <error-page>
        <error-code>404</error-code>
        <location>/errorPage404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/errorPage500.jsp</location>
    </error-page>
</web-app>
# JSP Action Tag를 통한 예외 페이지
페이지에서 에러가 발생할 때 특정 예외 페이지로 이동하도록 지정할 수 있다.
// Login.jsp
<%@ page errorPage=“errorPage.jsp” %>	
<!-- ... -->
Login.jsp 페이지에서 에러가 발생하면 errorPage.jsp로 이동한다. errorPage.jsp에는 <%@ page isErrorPage="true" %> JSP Action Tag를 추가하여 예외 페이지를 지정해야한다.
// errorPage.jsp
<%@ page isErrorPage=“true” %>
<!-- ... -->